//公用验证方法
import Vue from "vue";
const vm = new Vue();

/* JobCron表达式 */
export function validateRonExpression(rule, value, callback) {
  var reg = /^((\*|[0-9]{1,2}(-[0-9]}{1,2})?)(\/[0-9]+)?(,[0-9]+)*)\s+((\*|[0-9]{1,2}(-[0-9]{1,2})?)(\/[0-9]+)?(,[0-9]+)*)\s+((\*|[0-9]{1,2}(-[0-9]{1,2})?)(\/[0-9]+)?(,[0-9]+)*)\s+((\*|[0-9]{1,2}(-[0-9]{1,2})?)(\/[0-9]+)?(,[0-9]+)*)\s+((\*|[0-9]{1,2}(-[0-9]{1,2})?)(\/[0-9]+)?(,[0-9]+)*)$/;
  if (!reg.test(value)) {
      callback(new Error('表达式格式不正确'));
  }
  callback();
}

/* 是否是邮箱 */
export function validateEmail(rule, value, callback) {
    var reg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if (value && !reg.test(value)) {
        callback(new Error('邮箱格式不正确'));
    } else {
        callback();
    }
}

/* 是否是手机号 */
export function validatePhone(rule, value, callback) {
    var reg = /^1[3456789]\d{9}$/;
    if (value && !reg.test(value)) {
        callback(new Error('手机号格式不正确'));
    } else {
        callback();
    }
}

/* 是否是固定电话 */
export function validateMobile(rule, value, callback) {
    var reg = /^((0\d{2,3})-)?(\d{7,8})$/;
    if (value && !reg.test(value)) {
        callback(new Error('固定电话格式不正确'));
    } else {
        callback();
    }
}

/* 密码校验规则 */
export function validatePwd(rule, value, callback) {
    let re = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*_)(?=.*[!@#$%^&*]).{8,32}$/;
    if (!re.test(value)) {
        callback(new Error('密码必须有字母、数字、下划线、特殊字符，长度8-32位'));
    } else {
        callback();
    }
}




/* 是否是特殊字符*/
export function isSpecialChar(rule, value, callback) {
    const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+$/;
    if (value.length > 0 && !reg.test(value)) {
        return callback(new Error("不可输入特殊字符"));
    } else {
        callback();
    }
}

/** 验证是否整数 请输入整数 */
export function numType(rule, value, callback) {
    var re = /^[1-9]([0-9])*$/;
    if (value &&　!re.test(value)) {
        callback(new Error('请输入整数'));
    } else {
        callback();
    }
}
/** 验证是否整数 请输入整数 可输入0*/
export function numType1(rule, value, callback) {
    var re = /^[0-9]([0-9])*$/;
    if(value){
        if (!re.test(value)) {
            callback(new Error('请输入整数'));
        } else {
            callback();
        }
    }
}
/** 验证是否整数 请输入整数 可输入0  有值时验证*/
export function numType2(rule, value, callback) {
    var re = /^[0-9]([0-9])*$/;
    if (!re.test(value)&& value) {
        callback(new Error('请输入整数'));
    } else {
        callback();
    }
}


/**验证密码至少6位 */
export function validatePassLenght(rule, value, callback) {
    if (value.length < 6) {
        callback(new Error('changdu'));
    } else if (value.length > 16) {
        callback(new Error('changdu'));
    }
    callback();
}

/* 是否是邮箱*/
export function validateUrl(rule, value, callback) {
    var reg = /^((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?/;
    if (!reg.test(value)) {
        callback(new Error('url格式错误'));
    }
    callback();
}


/* 严格校验联系方式 */
export function validateContact(rule, value, callback) {
    var reg = /(^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$)|(^((\d3)|(\d{3}\-))?(1[35879]\d{9})$)/;

    if (!reg.test(value) && value) {
        callback(new Error('联系电话格式错误'));
    }
    callback();
}

/* 护照检验 */
export function checkPassport(rule, value, callback){
  var reg = /^((1[45]\d{7})|(G\d{8})|(P\d{7})|(S\d{7,8}))?$/
  if (!reg.test(value) && value) {
    callback(new Error('护照号码格式错误'));
  }
  callback();
}

/* 是否是身份证号码   有值时验证*/
export function validateIDNumber(rule, value, callback) {
    var reg = /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/;
    if (!reg.test(value) && value) {
        callback(new Error('身份证格式错误'));
    }else if( value && !validID18(value)){
        callback(new Error('身份证格式错误'));
    }else{
        callback();
    }
}

function validID18(str){
    if(str){
        let iW = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);//加权因子
        let iSum = 0;
        let iC,iVal,iJYM
         for (let i = 0; i < 17; i++) {
            iC = str.charAt(i);
            iVal = parseInt(iC);
            iSum += iVal * iW[i];
          }
          iJYM = iSum % 11;//取模
          var sJYM = '';
         //获取的模查找对应的校验码字符值
        if (iJYM == 0) sJYM = "1";
        else if (iJYM == 1) sJYM = "0";
        else if (iJYM == 2) sJYM = "x";
        else if (iJYM == 3) sJYM = "9";
        else if (iJYM == 4) sJYM = "8";
        else if (iJYM == 5) sJYM = "7";
        else if (iJYM == 6) sJYM = "6";
        else if (iJYM == 7) sJYM = "5";
        else if (iJYM == 8) sJYM = "4";
        else if (iJYM == 9) sJYM = "3";
        else if (iJYM == 10) sJYM = "2";
        let cCheck = str.charAt(17).toLowerCase();
        if (cCheck != sJYM) {
            return false;
         }
            return true;
    }else{
        return false;
    }
}



/* 社会统一信用代码验证*/
// 统一社会信用代码 精准
export function  checkSocialCardNumber(rule, value, callback) {
  if (value == "") {
    callback(new Error('社会统一信用代码验证格式错误'));
    // return false;
  } else {
    var firstarray = [
      "0",
      "1",
      "2",
      "3",
      "4",
      "5",
      "6",
      "7",
      "8",
      "9",
      "A",
      "B",
      "C",
      "D",
      "E",
      "F",
      "G",
      "H",
      "I",
      "J",
      "K",
      "L",
      "M",
      "N",
      "O",
      "P",
      "Q",
      "R",
      "S",
      "T",
      "U",
      "V",
      "W",
      "X",
      "Y",
      "Z",
    ];
    var firstkeys = [3, 7, 9, 10, 5, 8, 4, 2];
    var secondarray = [
      "0",
      "1",
      "2",
      "3",
      "4",
      "5",
      "6",
      "7",
      "8",
      "9",
      "A",
      "B",
      "C",
      "D",
      "E",
      "F",
      "G",
      "H",
      "J",
      "K",
      "L",
      "M",
      "N",
      "P",
      "Q",
      "R",
      "T",
      "U",
      "W",
      "X",
      "Y",
    ];
    var secondkeys = [
      1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28,
    ];
    function calc(code, array1, array2, b) {
      var count = 0;
      for (var i = 0; i < array2.length; i++) {
        var a = code[i];
        count += array2[i] * array1.indexOf(a);
      }
      var remainder = count % b;
      return remainder === 0 ? 0 : b - remainder;
    }
    var code = value.toUpperCase();
    if (code.length != 18) {
      console.log(1);
      callback(new Error('社会统一信用代码验证格式错误'));
      // return false;
    }
    var reg = /^\w\w\d{6}\w{9}\w$/;
    if (!reg.test(code)) {
      console.log(2);
      callback(new Error('社会统一信用代码验证格式错误'));
      // return false;
    } else {
      /*
          登记管理部门代码：使用阿拉伯数字或大写英文字母表示。​
          机构编制：1​
          民政：5​
          工商：9​
          其他：Y
      */
      let reg1 = /^[1,5,9,Y]\w\d{6}\w{9}\w$/;
      if (!reg1.test(code)) {
        console.log(3);
        callback(new Error('社会统一信用代码验证格式错误'));
        // return false;
      } else {
        /*
          机构类别代码：使用阿拉伯数字或大写英文字母表示。​
          机构编制机关：11打头​​
          机构编制事业单位：12打头​
          机构编制中央编办直接管理机构编制的群众团体：13打头​​
          机构编制其他：19打头​
          民政社会团体：51打头​
          民政民办非企业单位：52打头​
          民政基金会：53打头​
          村民委员会：54打头
          民政其他：59打头​
          工商企业：91打头​
          工商个体工商户：92打头​
          工商农民专业合作社：93打头​
          其他：Y1打头​
      */
        let reg2 = /^(11|12|13|19|21|31|32|33|34|35|41|51|52|53|54|55|61|62|59|71|72|81|91|92|93|A1|G1|J1|N1|N2|N3|Y1)\d{6}\w{9}\w$/;
        if (!reg2.test(code)) {
          console.log(4);
          callback(new Error('社会统一信用代码验证格式错误'));
          // return false;
        } else {
          /*
              登记管理机关行政区划码：只能使用阿拉伯数字表示。按照GB/T 2260编码。​
              例如：四川省成都市本级就是510100；四川省自贡市自流井区就是510302。​
              */
          let reg3 = /^(11|12|13|19|21|31|32|33|34|35|41|51|52|53|54|55|61|62|59|71|72|81|91|92|93|A1|G1|J1|N1|N2|N3|Y1)\d{6}\w{9}\w$/;
          if (!reg3.test(code)) {
            console.log(5);
            callback(new Error('社会统一信用代码验证格式错误'));
            // return false;
          } else {
            var firstkey = calc(code.substr(8), firstarray, firstkeys, 11);
            var firstword;
            if (firstkey < 10) {
              firstword = firstkey;
            }
            if (firstkey == 10) {
              firstword = "X";
            } else if (firstkey == 11) {
              firstword = "0";
            }
            if (firstword != code.substr(16, 1)) {
              console.log(6);
              callback(new Error('社会统一信用代码验证格式错误'));
              // return false;
            }else {
              var secondkey = calc(code, secondarray, secondkeys, 31);
              var secondword = secondarray[secondkey];
              if (!secondword || secondword != code.substr(17, 1)) {
                console.log(7);
                callback(new Error('社会统一信用代码验证格式错误'));
                // return false;
              }else {
                  var word = code.substr(0, 16) + firstword + secondword;
                  if (code != word) {
                    console.log(8);
                    callback(new Error('社会统一信用代码验证格式错误'));
                    // return false;
                  }else {
                    console.log(9);
                    callback()
                    // return true
                  }
              }
            }
          }
        }
      }
    }
  }
}

export function validatesocialCreditCode(rule, value, callback) {
    var reg = /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/;
    if (!reg.test(value) && value) {
        callback(new Error('社会统一信用代码验证格式错误'));
    }
    callback();
}


var isDateTime = function (format, reObj) {
    format = format || 'yyyy-MM-dd';
    var input = this, o = {}, d = new Date();
    var f1 = format.split(/[^a-z]+/gi), f2 = input.split(/\D+/g), f3 = format.split(/[a-z]+/gi), f4 = input.split(/\d+/g);
    var len = f1.length, len1 = f3.length;
    if (len != f2.length || len1 != f4.length) return false;
    for (var i = 0; i < len1; i++) if (f3[i] != f4[i]) return false;
    for (var i = 0; i < len; i++) o[f1[i]] = f2[i];
    o.yyyy = s(o.yyyy, o.yy, d.getFullYear(), 9999, 4);
    o.MM = s(o.MM, o.M, d.getMonth() + 1, 12);
    o.dd = s(o.dd, o.d, d.getDate(), 31);
    o.hh = s(o.hh, o.h, d.getHours(), 24);
    o.mm = s(o.mm, o.m, d.getMinutes());
    o.ss = s(o.ss, o.s, d.getSeconds());
    o.ms = s(o.ms, o.ms, d.getMilliseconds(), 999, 3);
    if (o.yyyy + o.MM + o.dd + o.hh + o.mm + o.ss + o.ms < 0) return false;
    if (o.yyyy < 100) o.yyyy += (o.yyyy > 30 ? 1900 : 2000);
    d = new Date(o.yyyy, o.MM - 1, o.dd, o.hh, o.mm, o.ss, o.ms);
    var reVal = d.getFullYear() == o.yyyy && d.getMonth() + 1 == o.MM && d.getDate() == o.dd && d.getHours() == o.hh && d.getMinutes() == o.mm && d.getSeconds() == o.ss && d.getMilliseconds() == o.ms;
    return reVal && reObj ? d : reVal;
    function s(s1, s2, s3, s4, s5) {
        s4 = s4 || 60, s5 = s5 || 2;
        var reVal = s3;
        if (s1 != undefined && s1 != '' || !isNaN(s1)) reVal = s1 * 1;
        if (s2 != undefined && s2 != '' && !isNaN(s2)) reVal = s2 * 1;
        return (reVal == s1 && s1.length != s5 || reVal > s4) ? -10000 : reVal;
    }
};

/* 验证6位邮编   有值时验证*/
export function validateZIP(rule, value, callback) {
    var reg = /^\d{6}$/;
    if (!reg.test(value) && value) {
        callback(new Error('请输入正确的6位邮编'));
    }
    callback();
}

/* 必填 */
export function validateRequire(rule, value, callback) {
    if (value == undefined) {
        return callback(new Error("必填"));
    } else if (value == '') {
        return callback(new Error("必填"));
    } else {
        callback();
    }
}

/* 年龄 */
export function validateAge(rule, value, callback) {
    if (value) {
        if (value < 0) {
            callback(new Error('年龄不能为负'));
        }

    }
    callback();
}
export function isInteger_8_10 (rule, value, callback) {
    if (value === '' || value === null) {
        callback()
    } else if (!/^\d{8}$|^\d{10}$/.test(value)) {
        callback(new Error('请输入8位或10位数字'))
    } else {
        callback()
    }
}
export function isInteger_10(rule, value, callback) {
    if (value === '' || value === null) {
        callback()
    } else if (!/^\d{10}$/.test(value)) {
        callback(new Error('请输入10位数字'))
    } else {
        callback()
    }
}
export function money(rule, value, callback) {
    if (value === '' || value === null) {
        callback()
    } else if (!/^(\d+(.\d{1,2})?)$/.test(value)) {
        callback(new Error('请填写正确的金额'))
    } else {
        callback()
    }
}

// 车牌号校验
export function vaildateCardNum(rule, value, callback){
    // var reg = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领超]))$/;
    var reg = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领超])|([京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[DF]{1}[0-9a-zA-Z]{5})|([京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{5}[DF]{1}))$/
    var reg1 = /^(([\u4e00-\u9fa5][a-zA-Z]|[\u4e00-\u9fa5]{2}\d{2}|[\u4e00-\u9fa5]{2}[a-zA-Z])[-]?|([wW][Jj][\u4e00-\u9fa5]{1}[-]?)|([a-zA-Z]{2}))([A-Za-z0-9]{5}|[DdFf][A-HJ-NP-Za-hj-np-z0-9][0-9]{4}|[0-9]{5}[DdFf])$/
    var reg2 = /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{1}[A-HJ-NP-Z0-9]{7})$/;
    if (!(reg.test(value)|| reg1.test(value) || reg2.test(value))&& value) {
        callback(new Error('请输入正确的车牌号'));
    }
    callback();
}

/** 验证是否整数 两数字并比较大小 */
export function numCompareList(numList, symbolList, rule, value, callback) {
    // var re = /^[1-9]([0-9])*$/;
    var re = /^([123456789]{1}\d*)|0$/;
    if (!re.test(value)) {
        callback(new Error('请输入整数'));
    } else if (re.test(value)) {
        for (var i = 0; i < numList.length; i++) {
            let num = numList[i];
            switch (symbolList[i]) {
                case '<':
                    num - value < 0 ? i == numList.length - 1 ? callback() : null : callback(new Error('输入数字大小限制'));
                    break;
                case '<=':
                    num - value <= 0 ? i == numList.length - 1 ? callback() : null : callback(new Error('输入数字大小限制'));
                    break;
                case '=':
                    num - value == 0 ? i == numList.length - 1 ? callback() : null : callback(new Error('输入数字大小限制'));
                    break;
                case '>':
                    num - value > 0 ? i == numList.length - 1 ? callback() : null : callback(new Error('输入数字大小限制'));
                    break;
                case '>=':
                    num - value >= 0 ? i == numList.length - 1 ? callback() : null : callback(new Error('输入数字大小限制'));
                    break;
                default:
                    i == numList.length - 1 ? callback() : null
            }
        }
    }
}

//验证数字（包括小数）
export function validateIsNumber(rule, value, callback) {
    console.log(value);
    let regs = /^\d+(?=\.{0,1}\d+$|$)/;
    if(value){
        if (!regs.test(value) && value) {
            callback(new Error('请填写正确的数字'));
        }else{
            let reg = /^([0-9]*)+(\.[0-9]{1,2})?$/;
            if (!reg.test(value) && value) {
                callback(new Error('最多只能输入两位小数'));
            }
            callback();
        }
    }
    else{
        callback();
    }
}

//验证数字(必须为整数)
export function validateIsNumberinteger(rule, value, callback) {
    let reg = /^[0-9]\d*$/;
    if (!reg.test(value) && value) {
        callback(new Error('请填写整数'));
    }
    callback();
}

//密码校验规则
export function validatePwd2(rule, value, callback) {
    let re = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,}$/;
    if (!re.test(value)) {
        callback(new Error('至少包含大写字母、小写字母、数字、特殊字符中三种类型，长度8位以上'));
    } else {
        callback();
    }
}
//密码校验规则
export function validatePwd3(rule, value, callback) {
  let re = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{10,}$/;
  if (!re.test(value)) {
      callback(new Error('至少包含大写字母、小写字母、数字、特殊字符中三种类型，长度10位以上'));
  } else {
      callback();
  }
}
//IP校验规则
export function isValidIP(rule, value, callback) {
    var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    if (reg.test(value) && value) {        
        callback();
    }else{
        callback(new Error('IP地址格式不正确'));
    }
    
} 
//端口校验规则
export function isPort(rule, value, callback) {
    if (/^[1-9]\d*|0$/.test(value) && value * 1 >= 0 && value * 1 <= 65535){
        callback();
    }else{
        callback(new Error('不是合法的端口号'));
    }
}
//姓名规则
export function validateName(rule, value, callback) {
    var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/
    if (!reg.test(value) && value) {
        callback(new Error('请输入正确的姓名'));
    }else {
        callback();
    }
}

